草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - 关于STL中Vector的一些问题

我有一些关于STL中vector的问题需要澄清......vector中的对象分配在哪里?堆?vector有边界检查吗?如果索引越界,会发生什么错误?为什么数组比vector快?有没有vector不能用而array必须用的情况? 最佳答案 在堆上的连续内存块中。vector以相同方式分配内存newint[x]会。仅当您使用at方法。它抛出一个std::out_of_range如果边界检查失败则异常。operator[]不执行边界检查。因为数组可以直接访问内存,而访问vector元素很可能涉及方法调用。不过,差异可能小得离谱,尤其是当

c++ - GCC STL 是线程安全的吗?

我在网上发现了相互矛盾的信息:http://www.sgi.com/tech/stl/thread_safety.htmlTheSGIimplementationofSTListhread-safeonlyinthesensethatsimultaneousaccessestodistinctcontainersaresafe,andsimultaneousreadaccessestotosharedcontainersaresafe.Ifmultiplethreadsaccessasinglecontainer,andatleastonethreadmaypotentiallywri

c++ - STL背后的设计原理

我查看了一些STL实现的来源(SGI、STLport、libc++),发现了一些似乎对所有或大多数实现都通用的设计模式,但我找不到理由。我认为一定有一个很好的共鸣,并想知道它是什么:许多类,包括vector和list_iterator等,被实现为2个类,例如list_iterator_base具有部分功能,然后list_iterator继承了list_iterator_base的其余部分。重点是什么?这似乎可以在一节课中轻松完成。迭代器似乎没有使用iterator类。使用它会有一些性能损失吗?这是我快速浏览时发现的2个问题。如果有人知道解释STL实现的实现原理的好资源,我会很高兴听到它

c++ - STL 迭代器 : container. 结束()

我正在阅读一些关于STL的文档,那里写到end()函数返回容器最后一个元素旁边字节的迭代器。我想知道,如果容器占用了整个可用内存的最后一个字节怎么办。那会发生什么? 最佳答案 C++内存模型保证您始终可以形成指向数组最后一个元素之后的元素的指针。如果没有,系统将不允许您在此位置分配对象,或者它会环绕。另外,请注意,这对于数组来说是一个潜在的问题,因为其他容器可以使用迭代器类型,这些迭代器类型以其他合适的形式处理结束位置:它们完全控制增量操作的工作方式。 关于c++-STL迭代器:cont

c++ - 包含对象指针的 STL 堆

我有一个std::listobjectList我需要在以下场景中进行排序和维护的容器:每个对象都有一个提供成本的特定字段(例如浮点值)。该成本值用于比较两个对象,就好像它们是float一样集合必须排序(升序)并且必须快速找到新插入元素的正确位置。可以删除最低的元素(就成本而言),也可以更新几个任意定位元素的成本。然后必须利用其已经排序的特性,尽快对该列表进行重新排序。我可以使用任何其他STL容器/机制来允许这三个行为属性吗?它非常类似于堆,我想使用make_heap可能是对列表进行排序的好方法。我需要一个指针容器,因为有几个其他数据结构依赖于这些指针。那么我怎样才能选择一个更好的容器,

c++ - 从 C++11 中的 STL 容器继承

我一直在考虑从C++11中的STL容器继承。我知道不应该在没有考虑的情况下这样做,因为没有虚拟析构函数。据我所知,使用typedef是为STL容器命名的首选方式。然而,typedef本身并非没有问题。首先,它们不能轻易地向前声明,并且两个typedef可能会意外地成为同一类型。思考以下问题:typedefstd::vectorvec_a_t;typedefstd::vectorvec_b_t;voidfunc(constvec_a_t&v);voidfunc(constvec_b_t&v);这两个函数应该根据逻辑类型vec_a_t或vec_b_t表现不同这种情况会很好,直到有人将vec

c++ - STL 关联容器 : erasing and getting back the (noncopyable) element

我正在使用STL关联容器(std::set和std::map),其中包含一个std::unique_ptr键。实例。键定义等效于以下内容:structKey{std::unique_ptrobject;booloperator==(constKey&rhs)const{returnobject->equal(*rhs.object);}booloperatorless(*rhs.object);}}众所周知,STL关联容器(尤其是自C++11起)无法获取对要移动的键的非常量引用。我的key是不可复制的,所以c++:Removeelementfromcontainerandgetitba

c++ - STL 容器及其元素的常量性——何时使用常量?

我对STL容器及其元素的常量性思考过度(有些人可能会说思考不足,让我们看看会发生什么)。我一直在寻找对此的讨论,但结果出奇地稀少。所以我不一定要在这里寻找明确的答案,我很乐意讨论让我头脑中的齿轮再次运转。假设我有一个类将std::strings保存在std::vector中。我的类(class)是一本字典,它从字典文件中读取单词。它们永远不会改变。所以将其声明为似乎是明智的std::vectorm_myStrings;但是,我读过零散的评论,您不应该在std::vector中使用const元素,因为这些元素需要可赋值。问题:是否存在在std::vector中使用const元素的情况(不

c++ - 如何将 C++ 类实例(使用 STL 容器)加载/保存到磁盘

我有一个C++类,它代表一个非常大的分层组织的数据树(~Gb,基本上和我在内存中所能承受的一样大)。它使用一个STL列表来存储每个节点的信息以及到其他节点的迭代器。每个节点只有一个父节点,但有0-10个子节点。抽象的,它看起来像:structnode{public:node_list_iteratorparent;//iteratortoasingleparentnodedoublenode_data_array[X];mapchildren;//iteratorstochildnodes};classstrategy{private:listtree;//hierarchically

iphone - 类似于 RAII 的惯用短生命周期本地对象

我遇到了Objective-C的这个片段:NSNumber*theBalance=[[[NSNumberFormatteralloc]init]numberFromString:[textFieldtext]];这似乎泄露了NSNumberFormatter。在C++中,我会做以下两件事之一:为NSNumberFormatter使用auto(即堆栈)存储使用RAII(例如shared_ptr)来管理NSNumberFormatter的生命周期在Objective-C中,这些选项似乎都不可行。我在堆栈上试过:NSNumberFormatterfmt;但这不能编译。据我所知,Objecti